# gevent模块
# 协程，在一个线程中来回的切换。这个切换过程不是操作系统做的，而是gevent做的
# 在这个patch_all后面的所有模块中，发生的阻塞都会有gevent的效果
from gevent import monkey;monkey.patch_all()
import time
import gevent

def eat():
    print('eating start')
    time.sleep(1)   # 发生IO阻塞,切换到play.因为有了mokey.patch_all所以这里等同于gevent.sleep(1)，遇见IO就会切换
    print('eating end')

def play():
    print('playing start')
    time.sleep(1) # 发生IO阻塞,切换到eat
    print('playing end')

if __name__ == '__main__':
    g1 = gevent.spawn(eat)
    g2 = gevent.spawn(play)
    g1.join()   # 阻塞等待协程执行结束
    g2.join()   #

# 协程任务之间的切换由程序代码（gevent）完成，只有遇到协程模块能识别到的IO操作的时候，程序才会进行协程切换，实现并发的效果